package cc.rengu.igas.route.common.enums;

import cc.rengu.igas.route.common.constant.SmartRouteParamConstant;
import cc.rengu.oltp.service.common.enums.AcctTypeEnum;

/**
 * 账户类型支持位图枚举
 *
 * @author lizhangtao
 * @version 1.0
 * @date 20200721
 */
public enum AcctTypeBitMapEnum {
    /**
     * 本行借记账户
     */
    BANK_DEBIT(0, AcctTypeEnum.BANK_DEBIT),
    /**
     * 本行贷记账户
     */
    BANK_CREDIT(1, AcctTypeEnum.BANK_CREDIT),
    /**
     * 本行存折
     */
    BANK_PASSBOOK(2, AcctTypeEnum.BANK_PASSBOOK),
    /**
     * 本行内部户
     */
    BANK_ACCT(3, AcctTypeEnum.BANK_ACCT),
    /**
     * 本行对公户
     */
    BANK_PUB_ACCT(4, AcctTypeEnum.BANK_PUB_ACCT),
    /**
     * 他行借记账户
     */
    OTHER_DEBIT(5, AcctTypeEnum.OTHER_DEBIT),
    /**
     * 他行贷记账户
     */
    OTHER_CREDIT(6, AcctTypeEnum.OTHER_CREDIT),
    /**
     * 他行存折
     */
    OTHER_PASSBOOK(7, AcctTypeEnum.OTHER_PASSBOOK),
    /**
     * 他行内部户
     */
    OTHER_ACCT(8, AcctTypeEnum.OTHER_ACCT),
    /**
     * 他行对公户
     */
    OTHER_PUB_ACCT(9, AcctTypeEnum.OTHER_PUB_ACCT),
    ;
    int index;
    AcctTypeEnum acctType;

    AcctTypeBitMapEnum(int index, AcctTypeEnum acctType) {
        this.index = index;
        this.acctType = acctType;
    }

    public int getIndex() {
        return index;
    }

    public AcctTypeEnum getAcctType() {
        return acctType;
    }

    public String getAcctCode() {
        return acctType.getAcctType();
    }

    public String getAcctDesc() {
        return acctType.getAcctDesc();
    }

    public static AcctTypeBitMapEnum create(String acctType) {
        if (AcctTypeEnum.BANK_DEBIT.getAcctType().equals(acctType)) {
            return BANK_DEBIT;
        } else if (AcctTypeEnum.BANK_CREDIT.getAcctType().equals(acctType)) {
            return BANK_CREDIT;
        } else if (AcctTypeEnum.BANK_PASSBOOK.getAcctType().equals(acctType)) {
            return BANK_PASSBOOK;
        } else if (AcctTypeEnum.BANK_ACCT.getAcctType().equals(acctType)) {
            return BANK_ACCT;
        } else if (AcctTypeEnum.BANK_PUB_ACCT.getAcctType().equals(acctType)) {
            return BANK_PUB_ACCT;
        } else if (AcctTypeEnum.OTHER_DEBIT.getAcctType().equals(acctType)) {
            return OTHER_DEBIT;
        } else if (AcctTypeEnum.OTHER_CREDIT.getAcctType().equals(acctType)) {
            return OTHER_CREDIT;
        } else if (AcctTypeEnum.OTHER_PASSBOOK.getAcctType().equals(acctType)) {
            return OTHER_PASSBOOK;
        } else if (AcctTypeEnum.OTHER_ACCT.getAcctType().equals(acctType)) {
            return OTHER_ACCT;
        } else if (AcctTypeEnum.OTHER_PUB_ACCT.getAcctType().equals(acctType)) {
            return OTHER_PUB_ACCT;
        } else {
            return null;
        }
    }

    /**
     * 当前账户类型是否在支持的位图中;配置长度不足10位，不配置的位按照默认支持返回
     *
     * @param bitmap 配置的位图按照如上枚举的index配置10位长度位图
     * @return true当前账户类型在支持的位图中、false当前账户类型不在支持的位图中
     */
    public boolean isSupport(String bitmap) {
        //不配置或者配置*默认支持所有账户类型
        if (null == bitmap || "".equals(bitmap) || SmartRouteParamConstant.ALL.equals(bitmap)) {
            return true;
        }
        //当前账户类型所在的位未配置默认支持，由于index从0开始因此位图需要减1
        if (this.index > (bitmap.length() - 1)) {
            return true;
        }
        //明确为N或n表示不支持，若为其他字符都认为支持
        if (SmartRouteParamConstant.CHAR_NO_UPPER == bitmap.charAt(this.index) ||
                SmartRouteParamConstant.CHAR_NO_LOWER == bitmap.charAt(this.index)) {
            return false;
        } else {
            return true;
        }
    }
}
